/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tresenraya;

/**
 *
 * @author Helena
 */

import static utilidades.constantes.*;

public class IteradorPosiciones implements Iterador<DecoradorPosicion> {
    DecoradorPosicion posicionDecorada;
    int iOrigen, jOrigen, iDestino, jDestino;
    boolean finSucesores;

    IteradorPosiciones(DecoradorPosicion posicionDecorada)
    {
        iOrigen = 0; jOrigen = 0; iDestino = 0; jDestino = 0;
        finSucesores = false;
        this.posicionDecorada = posicionDecorada;
    }

    DecoradorPosicion generarSucesorPoner()
    {
        DecoradorPosicion sucesor = posicionDecorada.clone();

        boolean encontradoSucesor = false;

        while(iDestino < 3 && !encontradoSucesor)
        {
            while(jDestino < 3 && !encontradoSucesor)
            {
                encontradoSucesor = posicionDecorada.getPosicion().preCondicionPonerFicha(iDestino, jDestino);
                if (encontradoSucesor)
                {
                    sucesor = sucesor = posicionDecorada.clone();
                    sucesor.getPosicion().ponerFicha(iDestino, jDestino);
                    sucesor.setMovimiento(PONER, iDestino, jDestino);
                }
                jDestino++;
            }
            if (jDestino >= 3)
            {
                jDestino = 0;
                iDestino++;
            }
        }

        finSucesores = !encontradoSucesor || iDestino >= 3;

        return sucesor;
    }

    DecoradorPosicion generarSucesorMover()
    {
        DecoradorPosicion sucesor = posicionDecorada.clone();
        boolean encontradoSucesor = false;

        while(iOrigen < 3 && !encontradoSucesor)
        {
            while(jOrigen < 3 && !encontradoSucesor)
            {
                while(iDestino < 3 && !encontradoSucesor)
                {
                    while(jDestino < 3 && !encontradoSucesor)
                    {
                        encontradoSucesor = posicionDecorada.getPosicion().preCondicionMoverFicha(iOrigen, jOrigen, iDestino, jDestino);
                        if (encontradoSucesor)
                        {
                            sucesor = sucesor = posicionDecorada.clone();
                            sucesor.getPosicion().moverFicha(iOrigen, jOrigen, iDestino, jDestino);
                            sucesor.setMovimiento(MOVER, iOrigen, jOrigen, iDestino, jDestino);
                        }
                        jDestino++;
                    }
                    if (jDestino >= 3)
                    {
                        jDestino = 0;
                        iDestino++;
                    }
                }
                if (iDestino >= 3)
                {
                    iDestino = 0;
                    jOrigen++;
                }
            }
            if (jOrigen >= 3)
            {
                jOrigen = 0;
                iOrigen++;
            }
        }

        finSucesores = !encontradoSucesor || iOrigen >= 3;

        return sucesor;
    }

    public DecoradorPosicion obtenerSiguiente()
    {
        if (posicionDecorada.getPosicion().faseActual()==MOVER)
        {
            return generarSucesorMover();
        }else
        {
            return generarSucesorPoner();
        }
    }


    public boolean haySiguiente()
    {
        return !finSucesores;
    }
}
